<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /*
        对象深拷贝：意味着对拷贝对象的任意属性更改不会影响原来的对象
        */

        // 数组的拷贝

        var arr = [1, 2, 3, {}];

        // 简单数据数组深拷贝
        // var arr1 = [];
        // for (var i = 0; i < arr.length; i++) {
        //     arr1.push(arr[i]);
        //     // arr1[i] = arr[i]
        // }

        // 简单数据数组深拷贝
        // var arr1 = arr.slice();
        // var arr1 = arr.splice(0, arr.length);
        // var arr1 = [].concat(arr);
        
        // 深克隆

        var arr1 = deepClone(arr);
        console.log(arr1, arr1 === arr, arr);
        console.log('arr1[3] === arr[3]', arr1[3] === arr[3]);

        // 对象的拷贝
        var obj = {
            name: '李白',
            friend: ['杜甫', '汪伦'],
            sayName: function () {
                console.log('你好');
            }
        }
        // var obj1 = {};
        // for(var i in obj){
        // 	obj1[i] = obj[i];
        // }
        /* 对象的合并方法 Object.assign( object0, 参与合并的对象1 ...2, ...3);   
        object0: 合并返回的对象,这个对象会将后面所有对象的属性复制一遍，如果对象上属性重复，那么后面的会覆盖前面的
        */
        // var obj1 = Object.assign({}, obj);

		// 先转换成JSON在转换成Object   对象的深拷贝，会丢失function 
        // var obj1 = JSON.parse(JSON.stringify(obj));


        function deepClone (obj) {
            if (typeof obj === 'object') {
                // 是null时
                if (obj === null) {
                    return obj
                }
                // 是数组或者对象
                var newObj = obj instanceof Array ? [] : {};
                for (var i in obj) {
                    newObj[i] = deepClone(obj[i])
                }
                return newObj;
            } else {
                return obj
            }
        }

        var obj1 = deepClone(obj);
        console.log(obj1, obj1 === obj, obj);
        console.log('obj1.friend === obj.friend', obj1.friend === obj.friend);
        console.log('obj1.sayName === obj.sayName', obj1.sayName === obj.sayName);

        console.log('name' in obj);
        console.log('ss' in obj);
        delete obj.name;
        console.log(obj);
    </script>
</body>
</html>